/* author：李长生
   info：发送请求第一步，封装axios
   point：
   1. 减少代码冗余
   2. 简化调用方式
   3. 便于后期维护 */

/* 在utils文件夹创建一个request.js文件 */

/* 引入axios */
import axios from 'axios'

/* 引入qs
1. 作用：把post方法参数格式由 对象 改为 x-www-form-urlencoded 格式（k=v&k=v）
2. 语法：post(url, qs.stringify(body)) */
import qs from 'qs'

/* 设置其他信息 */
// 1. 请求的基本路径
axios.defaults.baseURL = 'http://127.0.0.1:5000'

// 2. 请求拦截器
// 概念：请求拦截器是在每个请求被发送到服务器之前执行的函数，它们可以用来修改请求配置，例如添加身份验证令牌、设置请求头或处理请求参数
// config形参：是所有配置项，里面包含了请求头
axios.interceptors.request.use((config) => {
  /* 添加身份令牌 */
  // 1. 把登录保存的token取出来
  const token = localStorage.getItem('token')
  if (token) {
    // 2. 判断token是否存在，存在的话把token配置到请求头上
    config.headers.Authorization = token
  }

  return config
})

// 3. 响应拦截器
// 概念：响应拦截器是在每个响应被传递给then或catch之前执行的函数，它们可以用来处理响应数据，例如解析响应、统一错误处理或执行特定的业务逻辑

export default {
  /* 请求方式和参数的封装
  注意：为了简化请求，集中处理成功和失败的回调函数，使用Promise嵌套axios发请求用resolve和reject显示成功和失败 */

  // 1. get请求
  /* 注意：get请求的参数携带在请求行中，拼接在url地址栏后面，传参时直接写具体数据params（数字、字符串）
  语法：get(url, { params: data })，data是形参，代表传递的数据，形参可以用params替代
  简写：get(url, { params }) */
  get(url, params) {
    return new Promise((resolve, reject) => {
      /* 注意： */
      axios
        .get(url, { params })
        .then((res) => {
          resolve(res.data)
        })
        .catch((err) => {
          reject(err)
        })
    })
  },

  // 2. post请求
  /* 注意：post请求的参数携带在请求体Form Data中，传参时以对象body的方式传参
  并且参数格式要转换为x-www-form-urlencoded格式（k=v&k=v）
  使用qs文件管理模块转换格式
  语法：post(url, qs.stringify(body)) */
  post(url, body) {
    return new Promise((resolve, reject) => {
      axios
        .post(url, qs.stringify(body))
        .then((res) => {
          resolve(res.data)
        })
        .catch((err) => {
          reject(err)
        })
    })
  }
}
